package app

import (
	"go.uber.org/zap"
	"guns-excel/internal/pkg/log"
	"guns-excel/internal/pkg/transports/http"
	"os"
	"os/signal"
	"syscall"
)

type Application struct {
	name       string // 应用名称
	httpServer *http.Server
}

func New(name string, server *http.Server) (*Application, error) {
	app := &Application{
		name:       name,
		httpServer: server,
	}
	return app, nil
}

func (a *Application) Start() error {
	if a.httpServer != nil {
		if err := a.httpServer.Start(); err != nil {
			return err
		}
	}
	return nil
}

// 停止程序 通过接收信号
func (a *Application) AwaitSignal() {
	// 创建一个接收信号的通道
	c := make(chan os.Signal, 1)
	// kill 默认会发送 syscall.SIGTERM 信号
	// Ctrl+C就是触发系统SIGINT信号
	signal.Reset(syscall.SIGTERM, syscall.SIGINT)
	signal.Notify(c, syscall.SIGTERM, syscall.SIGINT)

	// 获取信号通道 这里还有阻塞作用
	select {
	case s := <-c:
		log.Logger.Info("退出程序", zap.String("signal", s.String()))
		if a.httpServer != nil {
			if err := a.httpServer.Stop(); err != nil {
				log.Logger.Warn("停止http服务失败", zap.Error(err))
			}
		}

		// 退出程序
		os.Exit(0)
	}
}
